#ifndef __SKY_SEGER_H__
#define __SKY_SEGER_H__

#include <string>
#include <vector>

#include "cam_wide.h"

#include "rknn_api.h"
#include <opencv2/opencv.hpp>

class SkySeger {
private:
    // 模型参数
    static const std::string sky_seg_model_path;
    static rknn_context template_session_;
    static void* template_modle_;

    static int input_height_;
    static int input_width_;
    static int output_height_;
    static int output_width_;

    static bool model_loaded;

    const float mean_vals[3] = { 0.0, 0.0, 0.0 };  // RGB
    const float norm_vals[3] = { 1.0 / 255.0, 1.0 / 255.0, 1.0 / 255.0};

private:
    int preprocess(const cv::Mat& img, cv::Mat& img_input);
    int process(const cv::Mat& img_input, std::vector<float>& output_data);
    int postprocess(const std::vector<float>& output_data, cv::Mat& img_sky_mask);

    float fastExp(float x);
    float sigmoid(float x);

    static void printRKNNTensor(rknn_tensor_attr *attr);
    static int printRKNNAttr(rknn_context ctx);

public:
    static int loadModel();
    int start(const cv::Mat& img, cv::Mat& img_sky_mask);

};

#endif